#include "stdafx.h"
#include "Sphere.h"

Sphere::Sphere():Objet(){}
Sphere::Sphere(Point centre1, float rayon1)
{
	centre = centre1;
	centre.normalize();
	rayon = rayon1;
}

Sphere::Sphere(Sphere const& sphere)
{
	centre = sphere.centre;
	centre.normalize();
	rayon = sphere.rayon;
}

Sphere::~Sphere(){}

Sphere& Sphere::operator=(Sphere const& sphere)
{
	centre = sphere.centre;
	rayon = sphere.rayon;

	return *this;
}

bool Sphere::intersection(Rayon r)
{
	Vecteur direction = r.getDirection();
	direction.normalize();
	Point origine = r.getOrigine();
	origine.normalize();
	Vecteur origneCentre(centre,origine);

	float t;
	Point interPoint;
	
	//Verifier si l'origine du point est dans le shpere
	//if(centre.distance(origine)< rayon)
	//{
		// Il n'existe pas d'intersection
	//	return false;
	//}else
	//{
		float a = direction.produitScalaire(direction);
		float b = 2 * direction.produitScalaire(origneCentre);
		float c = origneCentre.produitScalaire(origneCentre) - rayon*rayon;
		float d = (b*b)-(4*a*c);
		if(d<0)
		{
			// Il n'existe pas d'intersection
			return false;
		}
		else
		{
			t = (-b - sqrt(d) ) / ( 2 * a );
			if( t <= 0 )
				t = (-b + sqrt(d) ) / ( 2 * a );
			if(t <= 0)
			{
				// Il n'existe pas d'intersection
				return false;
			}
			else
			{
				interPoint.setX(origine.getX() + t*direction.getX());
				interPoint.setY(origine.getY() + t*direction.getY());
				interPoint.setZ(origine.getZ() + t*direction.getZ());
			
				inter.setPoint(interPoint);
				inter.setT(t);
				inter.setNormale(Vecteur(centre, interPoint));
				inter.setObjet(this);
				inter.setCouleur(couleur);

				return true;
			}
			
		//}
	}

}

BoiteEnglobante Sphere::getBoite()
{
	BoiteEnglobante b;
    
	b.corner1.setX(centre.getX() - rayon);
	b.corner1.setY(centre.getY() - rayon);
	b.corner1.setZ(centre.getZ() - rayon);

	b.corner2.setX(centre.getX() + rayon);
	b.corner2.setY(centre.getY() + rayon);
	b.corner2.setZ(centre.getZ() + rayon);	
    
	return b;
}

bool Sphere::aBoite()
{
	return true;
}

